/*
 * MovementHandler.h
 *
 *  Created on: 28/10/2013
 *      Author: fernando
 *
 *      Esta clase se encarga de manejar los movimientos del mouse
 *      y de actualizar los valores correspondientes del tablero que se dibuja
 */

#ifndef MOVEMENTHANDLER_H_
#define MOVEMENTHANDLER_H_

#include "TableroSDL.h"
#include "../../Common/Conexion.h"
#include "jsoncpp/json/json.h"



const unsigned int MAXPIXELMOV = 64;

class MovementHandler {
public:
	//El constructor recibe un tablero y un socket.
	MovementHandler(TableroSDL* tablero, Conexion* sock,std::string k);
	~MovementHandler();
	//Permite identificar la posicion al momento de apretar el mouse
	void pulsaGolosina();
	//Permite indicar la posicion del mouse en cada momento
	void ubicarMouse(unsigned int, unsigned int);
	//Mueve la golosina por la pantalla
	void moverGolosina();
	//Suelta la golosina en la posicion de destino y ejecuta los eventos
	//subsiguientes.
	int soltarGolosina();
	//Intercambia las golosinas de dos celdas
	void intercambiar(unsigned int nCelda1, unsigned int nCelda2);
	//Elimina a partir de un json las celdas indicadas y reemplaza con
	//la golosina correspondiente
	void eliminarYRellenarPosiciones(Json::Value);
	//Obtiene el numero de celda a partir del numero de columna y de fila
    unsigned int getCeldaFromPos(unsigned int nCol, unsigned int nFil);
    //Devuelve un puntero al tablero
    TableroSDL* getTablero();
    //Devuelve un puntero al Stream
    Conexion* getStream();
    //Setea el mensaje Json con los movimientos
    void setJsonMov(Json::Value);
    //Permite saber si debe cerrarse el cliente
    bool getTerminar();
    //Permite indicar si debe cerrarse el cliente
    void setTerminar(bool value);
    //Bloquea o desbloquea los movimientos
    void setBloqueo(bool value);
    //Se fija si los movimientos estan bloqueados
    bool getBloqueo();
    bool getGano();
    void setGano(bool value);

private:
    //Destruye la golosina de la celda indicada
	void destruirGolosina(CeldaSDL* celda);
    //Envia un intercambio al servidor
    void enviarIntercambio(unsigned int numCelOrigen,
    		unsigned int numCelDestino);
	bool limiteAlcanzado;
	bool mouseApretado;
	Golosina* golosinaOrigen;
	Golosina* golosinaDestino;
	unsigned int xOrigen;
	unsigned int yOrigen;
	unsigned int xActual;
	unsigned int yActual;
	int direccion;//puede ser horizontal o vertical
	TableroSDL* tablero;
	Conexion* stream;
	Json::Value resMovimiento;
	bool terminar;
	bool bloqueado;
	bool gano;
	std::string key;
	MovementHandler(const MovementHandler& handler);
};

#endif /* MOVEMENTHANDLER_H_ */
